package com.company.ecis.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;

import com.company.ecis.entity.Trade;

import com.company.ecis.domain.CalendarUtil;
import com.company.ecis.domain.Contants;
import com.company.ecis.domain.ReturnObject;
import com.company.ecis.domain.Tradecodition;
import com.company.ecis.entity.Trade;
import com.company.ecis.entity.Userinfo;

import com.company.ecis.mapper.TradeMapper;
import com.company.ecis.service.TradeService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


import javax.servlet.http.HttpSession;
import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;


/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author testjava
 * @since 2022-08-04
 */
@Service
public class TradeServiceImpl extends ServiceImpl<TradeMapper, Trade> implements TradeService {

    @Autowired
    private TradeMapper tradeMapper;

    @Override
    public boolean insertTrade(Trade trade) {
        return tradeMapper.insert(trade) == 1;
    }


    @Override
    public ReturnObject findByCondition(Integer page, Integer limit, Tradecodition tradecodition,HttpSession session) throws ParseException {
        //1.将用户传递来的卡号作为直接的查询条件
        Userinfo userinfo = (Userinfo)session.getAttribute("userinfo");
        String cardId = userinfo.getCardId().toString();
        //2.在mybatisplus中使用selectList查询方法
        //3.创建给前端返回的returnObject对象
        ReturnObject returnObject = new ReturnObject();
        //现在开始时间和结束时间同时出现
        //首先判断开始时间和结束时间
        //按照时间查询：1.开始时间和结束时间都为空
        if((tradecodition.getStartTime()==null&&tradecodition.getEndTime()==null)||
                (tradecodition.getStartTime().equals("")&&tradecodition.getEndTime().equals(""))){
            if(tradecodition.getPayType()!=null){
                //给查询数据库的时候添加交易的约束条件
                if(!tradecodition.getPayType().equals("全部")){
                    //查询开始时间和结束时间为空的全部记录
                    QueryWrapper<Trade> wrapper2 = new QueryWrapper<Trade>()
                            .and(wrapper3 -> wrapper3.eq("payer_ident", cardId).or().eq("payee_ident", cardId))
                            .last("limit " + (page - 1) * limit + "," +  limit)
                            .eq("pay_type",tradecodition.getPayType());

                    QueryWrapper<Trade> wrapperPage = new QueryWrapper<Trade>()
                            .and(wrapper4 -> wrapper4.eq("payer_ident", cardId).or().eq("payee_ident", cardId))
                            .eq("pay_type",tradecodition.getPayType());
                    //查询分页显示的数据

                    List<Trade> trades = tradeMapper.selectList(wrapper2);
                    //确保查询数据分页的页码保持不变
                    Integer count = tradeMapper.selectCount(wrapperPage);
                    //用户需要将查询的数据集成为RetuenObject对象返回给前端
                    returnObject.setCode(Contants.RETURN_OBJECT_CODE_SUCCESS);
                    returnObject.setMsg(Contants.FIND_SUCCESS);
                    returnObject.setData(trades);
                    returnObject.setCount(count);
                    return returnObject;

                }
            }
            //为了保证分页查询当你点击页码的时候保证查询的数据一定.页面之间可以相互切换
            QueryWrapper<Trade> wrapper2 = new QueryWrapper<Trade>()
                    .and(wrapper3 -> wrapper3.eq("payer_ident", cardId).or().eq("payee_ident", cardId))
                    .last("limit " + (page - 1) * limit + "," +  limit)
                    .orderBy(true,false,"gmt_created");
            QueryWrapper<Trade> wrapperPage = new QueryWrapper<Trade>()
                    .and(wrapper4 -> wrapper4.eq("payer_ident", cardId).or().eq("payee_ident", cardId));
            //查询分页展示的数据
            List<Trade> trades = tradeMapper.selectList(wrapper2);
            //确保查询数据分页的页码保持不变
            Integer count = tradeMapper.selectCount(wrapperPage);
            //用户需要将查询的数据集成为RetuenObject对象返回给前端
            returnObject.setCode(Contants.RETURN_OBJECT_CODE_SUCCESS);
            returnObject.setMsg(Contants.FIND_SUCCESS);
            returnObject.setData(trades);
            returnObject.setCount(count);
            return returnObject;
        }

        //将前端传递来的String类型的日期转换为Date类型
        //将前端传来的String类型的日期转为Date
        Date startTime = CalendarUtil.CalendarByMonth(tradecodition.getStartTime(), tradecodition.getEndTime(), tradecodition.getPayTime(),0);
        //将结束日期增加一天
        Date endTime = CalendarUtil.CalendarByMonth(tradecodition.getStartTime(), tradecodition.getEndTime(), tradecodition.getPayTime(),1);
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(endTime);
        calendar.add(calendar.DATE,1);
        //重新将endTime赋值
        endTime=calendar.getTime();


        QueryWrapper<Trade> wrapper4 = new QueryWrapper<Trade>()
                .and(wrapper3 -> wrapper3.eq("payer_ident", cardId).or().eq("payee_ident", cardId))
                .orderBy(true,false,"gmt_created");;
        //使用mybatisplus执行SQL语句
        wrapper4.between("gmt_created",startTime,endTime);
        //还需要添加查询的登录用户的cardID作为查询条件,将前端传来的参数进行对比
        wrapper4.last("limit " + (page - 1) * limit + "," + limit);
        if(tradecodition.getPayType()!=null){
            if(!tradecodition.getPayType().equals("全部")){
                wrapper4.eq("pay_type",tradecodition.getPayType());
            }
        }
        //查询交易信息并封装在数组中
        List list = tradeMapper.selectList(wrapper4);

        //为保持前端layui框架中点击分页插件不变---必须返回查询结果的总条数
        QueryWrapper<Trade> wrapperPage = new QueryWrapper<Trade>()
                .and(wrapper5 -> wrapper5.eq("payer_ident", cardId).or().eq("payee_ident", cardId))
                .orderBy(true,false,"gmt_created");;
        wrapperPage.between("gmt_created",startTime,endTime);
        if(tradecodition.getPayType()!=null){
            if(!tradecodition.getPayType().equals("全部")){
                wrapperPage.eq("pay_type",tradecodition.getPayType());
            }
        }

        Integer count = tradeMapper.selectCount(wrapperPage);
        //用户需要将查询的数据集成为RetuenObject对象返回给前端
        returnObject.setCode(Contants.RETURN_OBJECT_CODE_SUCCESS);
        returnObject.setMsg(Contants.FIND_SUCCESS);
        returnObject.setData(list);
        returnObject.setCount(count);
        return returnObject;
    }

}
